package com.itheima;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.function.Consumer;

/**
 * HashSet原理解析
 * 1.创建一个默认长度16的数组，数组名为table
 * 2.根据元素的哈希值跟数组的长度求余计算出应存入的位置（哈希算法）0-15  哈希值->扰乱->取模
 * 3.判断当前位置是否为null，如果是null，则调用equals方法比较
 * 4.如果位置不为null，表示有元素，则调用equals方法比较
 * 5.如果一样，则不存，如果不一样，则存入数组
 *
 * 哈希表是一种增删改查数据性能都较好的结构
 * 时间复杂度在O(1)到O(n)之间
 *
 * 红黑树时间复杂化度在O(1)到O(logn)之间
 *
 */
public class HashSetDemo {
    public static void main(String[] args) {
        //用HashSet去重
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三");
        list.add("李四");
        list.add("王五");
        System.out.println(list);
        System.out.println(new HashSet<String>(list));



        //1. 创建HashSet对象
        HashSet<String> hashSet = new HashSet<>();
        //2.保存数据
        //可以去重
        hashSet.add("张三");
        hashSet.add("李四");
        hashSet.add("王五");
        hashSet.add("王五");
        hashSet.add("王五");
        hashSet.add("王五");
        hashSet.add("赵六");
        System.out.println(hashSet);
        //3.取数据（迭代器）iterator
        //hasNext判断是否还有数据
        Iterator<String> iterator = hashSet.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            System.out.println(next);
        }
//        for (int i = 0; i < hashSet.size(); i++) {
//
//        }//用不了
        //4.取数据（增强for循环）
        for (String name : hashSet) {
            System.out.println(name);
        }
        //5.取数据（Lambda）
        hashSet.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        hashSet.forEach(s -> System.out.println(s));

        hashSet.forEach(System.out::println);
        //若没有
        //@Override
        //    public String toString() {
        //        return "Student{" +
        //                "name='" + name + '\'' +
        //                ", age=" + age +
        //                '}';
        //    }
        //则显示堆地址com.itheima.Student@3d075dc0（随机数）
        //@3d075dc0为hash值

        Student student = new Student("张三", 20);
        //toHexString转化为一个十六进制数
        //native本地

        //toString
        System.out.println(student);

    }
}
